#!/bin/bash
# ThingsBoard 备份通知脚本
# 版本: 1.0.1
# 注意: 该脚本使用UTF-8编码，请确保编辑器使用正确的编码方式

# 记录当前工作目录
CURRENT_DIR=$(pwd)

# 获取脚本所在目录的绝对路径
SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd)

# 根据脚本目录计算项目根目录路径
if [[ "$SCRIPT_DIR" == */scripts/monitoring ]]; then
  # 如果脚本位于scripts/monitoring目录中
  PROJECT_ROOT=$(cd "$SCRIPT_DIR/../.." && pwd)
elif [[ "$SCRIPT_DIR" == */scripts/* ]]; then
  # 如果脚本位于scripts目录或其他子目录中
  PROJECT_ROOT=$(echo "$SCRIPT_DIR" | sed 's|\(.*\)/scripts.*|\1|')
else
  # 否则假设当前目录是项目根目录
  PROJECT_ROOT=$(pwd)
fi

# 配置文件路径
CONFIG_FILE="$PROJECT_ROOT/config/backup_env.conf"

# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
  echo "错误: 配置文件不存在: $CONFIG_FILE"
  exit 1
fi

# 导入共用函数 - 使用绝对路径
COMMON_SCRIPT="$PROJECT_ROOT/scripts/common.sh"
if [ -f "$COMMON_SCRIPT" ]; then
  source "$COMMON_SCRIPT"
else
  echo "错误: 共用脚本不存在: $COMMON_SCRIPT"
  exit 1
fi

# 解析参数
SUBJECT=""
MESSAGE=""
EMAIL_ONLY=false
LEVEL="info"  # info, warn, error

usage() {
    echo "使用方法: $0 -s <主题> -m <消息> [-l <级别>] [-e] [-c]"
    echo "  -s <主题>    通知主题"
    echo "  -m <消息>    通知消息内容"
    echo "  -l <级别>    通知级别 (info, warn, error) [默认: info]"
    echo "  -e          仅发送邮件，不记录日志"
    echo "  -c          检查MinIO连接状态"
    echo "  -h          显示此帮助"
    exit 1
}

# 检查MinIO连接函数
check_minio_connection() {
    log_info "检查MinIO连接状态..."

    # 验证MinIO环境变量是否设置
    if [ -z "$MINIO_HOST" ] || [ -z "$MINIO_PORT" ] || [ -z "$MINIO_USER" ] || [ -z "$MINIO_PASSWORD" ] || [ -z "$MINIO_BUCKET" ]; then
        log_error "MinIO配置不完整，请检查config/backup_env.conf中的MinIO配置"
        return 1
    fi

    # 检查MinIO服务是否可访问
    if ! curl -s --connect-timeout 5 "http://$MINIO_HOST:$MINIO_PORT/minio/health/live" > /dev/null; then
        log_error "无法连接到MinIO服务器: http://$MINIO_HOST:$MINIO_PORT"
        return 2
    fi

    # 尝试使用s3cmd验证凭据和存储桶访问
    if command -v s3cmd &> /dev/null; then
        # 创建临时s3cfg配置文件
        TEMP_S3CFG=$(mktemp)
        cat > "$TEMP_S3CFG" << EOF
[default]
access_key = $MINIO_USER
secret_key = $MINIO_PASSWORD
host_base = $MINIO_HOST:$MINIO_PORT
host_bucket = $MINIO_HOST:$MINIO_PORT
use_https = False
signature_v2 = False
EOF

        # 尝试列出存储桶内容
        if ! s3cmd -c "$TEMP_S3CFG" ls "s3://$MINIO_BUCKET/" > /dev/null 2>&1; then
            log_error "无法访问MinIO存储桶: $MINIO_BUCKET，请检查凭据和权限"
            rm -f "$TEMP_S3CFG"
            return 3
        fi

        # 尝试访问特定目录
        if ! s3cmd -c "$TEMP_S3CFG" ls "s3://$MINIO_BUCKET/$MINIO_FULL_PREFIX/" > /dev/null 2>&1; then
            log_warn "无法访问MinIO路径: $MINIO_BUCKET/$MINIO_FULL_PREFIX/"
        fi

        rm -f "$TEMP_S3CFG"
    else
        # 使用curl检查存储桶是否存在
        if ! curl -s --connect-timeout 5 -I -u "$MINIO_USER:$MINIO_PASSWORD" "http://$MINIO_HOST:$MINIO_PORT/$MINIO_BUCKET" | grep -q "200 OK"; then
            log_error "无法访问MinIO存储桶: $MINIO_BUCKET，请检查存储桶是否存在"
            return 4
        fi
    fi

    # 检查WAL-G配置
    if [ -f "/root/.walg.json" ]; then
        log_info "当前WAL-G配置:"
        cat "/root/.walg.json" | grep -v "PASSWORD" | grep -v "SECRET"
    fi

    log_success "MinIO连接状态检查完成"
    return 0
}

while getopts "s:m:l:ech" opt; do
    case $opt in
        s) SUBJECT="$OPTARG" ;;
        m) MESSAGE="$OPTARG" ;;
        l) LEVEL="$OPTARG" ;;
        e) EMAIL_ONLY=true ;;
        c) check_minio_connection; exit $? ;;
        h) usage ;;
        *) usage ;;
    esac
done

# 检查必要参数
if [ -z "$SUBJECT" ] || [ -z "$MESSAGE" ]; then
    log_error "通知主题和消息内容不能为空"
    usage
fi

# 根据级别记录日志
if [ "$EMAIL_ONLY" = "false" ]; then
    case "$LEVEL" in
        info) log_info "$SUBJECT - $MESSAGE" ;;
        warn) log_warn "$SUBJECT - $MESSAGE" ;;
        error) log_error "$SUBJECT - $MESSAGE" ;;
        *) log_error "无效的通知级别: $LEVEL" && exit 1 ;;
    esac
fi

# 发送邮件通知
if [ "$ENABLE_NOTIFICATIONS" = "true" ]; then
    log_info "发送通知邮件到 $NOTIFICATION_EMAIL..."

    # 创建通知正文
    NOTIFICATION_BODY="主题: $SUBJECT
级别: $LEVEL
时间: $(date +"%Y-%m-%d %H:%M:%S")
主机: $(hostname)

$MESSAGE

---
此邮件由ThingsBoard备份系统自动发送
"

    # 发送邮件
    echo "$NOTIFICATION_BODY" | mail -s "ThingsBoard备份通知: $SUBJECT" "$NOTIFICATION_EMAIL"
    MAIL_STATUS=$?

    if [ $MAIL_STATUS -ne 0 ]; then
        log_error "通知邮件发送失败: $MAIL_STATUS"
        exit 1
    else
        log_info "通知邮件发送成功"
    fi
else
    log_info "通知功能未启用，跳过邮件发送"
fi

# 可以扩展，添加更多通知渠道，如短信、企业微信、钉钉等

exit 0
